import axios from "axios";
import {ElMessage, ElMessageBox} from 'element-plus'
import errorCode from "@/utils/errorCode";
import {getToken} from "@/utils/tools/auth";
import {useUserStore} from "/src/store/modules/user";
import {useDialogStore} from "@/store/index/dialog";
import {showFullScreenLoading, tryHideFullScreenLoading} from "@/components/plugins/loading";
import cache from "@/components/plugins/cache";


// 环境配置
const env = import.meta.env;

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
export  function request(config){
    let baseUrl= env.VITE_APP_APT_BASEURL;
    const service = axios.create({
        // axios中请求配置有baseURL选项，表示请求URL公共部分
        baseURL: baseUrl,
        // 超时
        timeout: 10000,
    })
    // 添加请求拦截器
    service.interceptors.request.use(function (config) {
        // 在发送请求之前做些什么
        // 是否需要设置 token
        const isToken = (config.headers || {}).isToken === false;
        // 是否加载动画
        const isLoading = (config.headers || {}).isLoading === false;
        // 是否需要防止数据重复提交
        const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;

        //检查请求头中是否设置了token字段
        let token = getToken();
        if (token && !isToken ) {
            // config.headers['token'] = token;  // 设置请求头
            config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
        }
        //检查请求头中是否设置了repeatSubmit字段，并判断其值是否为false。如果不是false，则意味着不需要防止数据重复提交。
        if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')){
            const requestObj = {
                url: config.url,
                data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
                time: new Date().getTime()
            }
            const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
            const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
            if (requestSize >= limitSize) {
                console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制，无法进行防重复提交验证。')
                return config;
            }
            const sessionObj = cache.session.getJSON('sessionObj')
            if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
                cache.session.setJSON('sessionObj', requestObj)
            } else {
                const s_url = sessionObj.url;                  // 请求地址
                const s_data = sessionObj.data;                // 请求数据
                const s_time = sessionObj.time;                // 请求时间
                const interval = 1000;                 // 间隔时间(ms)，小于此时间视为重复提交
                if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
                    const message = '您点得太快啦！';
                    console.warn(`[${s_url}]: ` + message)
                    return Promise.reject(new Error(message))
                } else {
                    cache.session.setJSON('sessionObj', requestObj)
                }
            }
        }
        //是否加载动画
        if (!isLoading){
            // console.log(1)
            showFullScreenLoading(); //显示加载中
        }
        return config;
    }, function (error) {
        // 对请求错误做些什么
        return Promise.reject(error);
    });

// 添加响应拦截器
    service.interceptors.response.use(
        function(res) {
            tryHideFullScreenLoading();
            const store = useUserStore();
            const dialogStore = useDialogStore();
            const code = res.data.code || 200;
            let isReLogin = { show: false };
            const msg = errorCode[code] || res.data.msg || errorCode['default'];
            if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
                return res.data;
            }
            if (code === 401) {
                if (!isReLogin.show) {
                    isReLogin.show = true;
                    ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
                        confirmButtonText: '重新登录',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(() => {
                        dialogStore.dialog({dialogVisible: true, dialogValue: 'login'});
                        isReLogin.show = false;
                    }).catch(() => {
                        // 用户取消时的处理逻辑
                        isReLogin.show = false;
                    });
                    store.clearStore();
                }
                // return Promise.reject(new Error(msg));
            } else if (code === 500 || code === 600 || code === 601 || code !== 200) {
                ElMessage({ message: msg, type: code >= 500 ? 'warning' : 'error' });
                if(code >= 500){
                    return res.data;
                }
                return Promise.reject(new Error(msg))
            } else {
                return res.data;
            }
        },
        function(error) {
            tryHideFullScreenLoading();
            console.log('err' + error);
            let { message } = error;
            if (message === "Network Error") {
                message = "网络连接异常";
            }
            ElMessage({ message: message, type: 'error' });
            return Promise.reject(error); // 返回原始错误对象
        }
    );
    return service(config);
}
